package net.tv90.volunteerserveradmin.manager;

// 导入所需的类和注解
import jakarta.annotation.Resource;
import net.tv90.volunteerserveradmin.utils.entity.Mail;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;

/**
 * MailManager 类负责管理邮件的发送，包括验证码邮件和身份验证提醒邮件。
 * 它利用 JMS（Java消息服务）将邮件任务异步发送到消息队列，并通过监听器处理邮件发送。
 */
@Component // 标识该类为 Spring 的组件，允许被自动扫描和注入
public class MailManager {

    // 注入 JavaMailSender 用于发送邮件
    @Resource
    private JavaMailSender mailSender;

    // 注入 JmsMessagingTemplate 用于与 JMS 消息队列交互
    @Resource
    private JmsMessagingTemplate jmsMessagingTemplate;

    // 从配置文件中读取应用程序名称
    @Value("${spring.application.name}")
    private String name;

    // 从配置文件中读取发件人地址
    @Value("${spring.mail.addr}")
    private String addr;

    /**
     * 发送验证码邮件到指定的邮箱。
     *
     * @param email 收件人的邮箱地址
     * @param code  验证码
     */
    public void sendCodeMailTo(String email, String code) {
        // 创建 Mail 对象，包含邮件的各个部分
        Mail mail = new Mail(
                addr + "(" + name + ")", // 发件人地址和应用名称
                email, // 收件人地址
                code + " 是你的验证码", // 邮件标题
                "【" + name + "】验证码：" + code + "。验证码提供他人可能导致账号被盗，请勿转发或泄漏。" // 邮件正文
        );
        // 将 Mail 对象发送到名为 "mail.queue" 的消息队列中
        jmsMessagingTemplate.convertAndSend("mail.queue", mail);
    }

    /**
     * 发送身份验证提醒邮件到指定的邮箱。
     *
     * @param email    收件人的邮箱地址
     * @param username 用户名
     */
    public void sendIdentifyMailTo(String email, String username) {
        // 创建 Mail 对象，包含邮件的各个部分
        Mail mail = new Mail(
                addr + "(" + name + ")", // 发件人地址和应用名称
                email, // 收件人地址
                "身份验证提醒", // 邮件标题
                "用户" + username + "，你的身份验证已经完成。如非本人操作，请立即修改密码，并联系管理员。" // 邮件正文
        );
        // 将 Mail 对象发送到名为 "mail.queue" 的消息队列中
        jmsMessagingTemplate.convertAndSend("mail.queue", mail);
    }

    /**
     * 发送重置密码的验证码邮件到指定的邮箱。
     *
     * @param email 收件人的邮箱地址
     * @param code  验证码
     */
    public void sendResetPasswordCodeMailTo(String email, String code) {
        // 创建 Mail 对象，包含邮件的各个部分
        Mail mail = new Mail(
                addr + "(" + name + ")", // 发件人地址和应用名称
                email, // 收件人地址
                code + " 是你的验证码", // 邮件标题
                "【" + name + "】验证码：" + code + "。你正在进行找回密码操作，验证码提供他人可能导致账号被盗，请勿转发或泄漏。" // 邮件正文
        );
        // 将 Mail 对象发送到名为 "mail.queue" 的消息队列中
        jmsMessagingTemplate.convertAndSend("mail.queue", mail);
    }

    /**
     * JMS 监听器，监听 "mail.queue" 队列中的消息，并发送邮件。
     *
     * @param mail 从消息队列中接收到的 Mail 对象
     */
    @JmsListener(destination = "mail.queue") // 指定监听的消息队列
    public void sendCodeMailListener(Mail mail) {
        // 创建 SimpleMailMessage 对象，用于构建邮件内容
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(mail.getFrom()); // 设置发件人
        mailMessage.setTo(mail.getTo()); // 设置收件人
        mailMessage.setSubject(mail.getTitle()); // 设置邮件标题
        mailMessage.setText(mail.getText()); // 设置邮件正文
        // 使用 JavaMailSender 发送邮件
        mailSender.send(mailMessage);
    }

}
